<?php

class Personne{
    private $login;
    private $nom;
    private $prenom;
    private $adresse;
    private $mail;
    private $dateNaissance;
    
    private $connected;//bool�en pour savoir si l'utilisateur est connect� ou non
    
    private $asso; //tableau avec la liste des assos
    private $cotis;//tableau avec toutes les ann�es de cotisation
    private $rapports;//tableau avec tous les rapports 
    
    public function __construct($_login){
        $this->login=$_login;
        if(isset($_SESSION['user'])&&$_SESSION['user']==$this->login)
            $this->connected=TRUE;
        else
            $this->connected=FALSE;
        
    }
    
    public function debug(){
        //fonction outil qui affiche simplement le contenu de chaque attribut
        print_r($this->login);
        print_r($this->nom);
        print_r($this->prenom);
        print_r($this->adresse);
        print_r($this->mail);
        print_r($this->dateNaissance);
        print_r($this->cotis);
        print_r($this->asso);
        print_r($this->connected);
                      
    }
    public function LogIn($mdp, DbConnection $db){
        //Note : normalement les variables php ne sont pas typ�es
        //mais l� j'ai mis que je veux explicitement un objet de type DbConnection 
        //dans le champ $db
        
        
        $sql='SELECT pwd FROM Personne WHERE login=\''.$this->login.'\' ;';
        
        $query= new DbQuery($db,$sql); //Cr�ation d'un objet Query gr�ce � la requete SQL et la BDD pass�e en param�tre
        $query->SendQuery();//envoi de la requ�te
        $result=$query->GetResult();//r�cup�ration de la premi�re ligne du tableau de r�sultats. Il y a au maximum une ligne
        if(isset($result)&&$result['pwd']==md5($mdp))
        //comme les mdp sont crypt�s en md5 dans la base, il faut tester encrypter le mot de passe qu'on veut tester
        {
            //si pour le login donn�, le mot de passe correspond, on cr�e une variable de session
            $this->connected=TRUE;           
            $_SESSION['user']=$this->login;           
            $_SESSION['pwd']=$mdp;   
        }else{
            $this->connected=FALSE;
        } 
        
    }
    public function LogOut(){
        unset($_SESSION['user']);
        unset($_SESSION['pwd']);
    }
    
    public function FillFromLogin(DbConnection $db){
        
        $sql='SELECT nom, prenom, adresse, datenaissance, mail FROM Personne WHERE login=\''.$this->login.'\' ;';
        
        $query= new DbQuery($db,$sql);
        $query->SendQuery();
        $result=$query->GetResult();
        if(isset($result))
        {
            $this->nom=$result['nom'];
            $this->prenom=$result['prenom'];
            $this->adresse=$result['adresse'];
            $this->dateNaissance=$result['datenaissance'];
            $this->mail=$result['mail'];
            
            $_SESSION['user']=$this->login;
        }
        
    }
    
    public function FillAssoArray(DbConnection $db){
        //rempli le tableau $asso avec l'asso, le semestre et le r�le si mentionn�
        $sql='SELECT MA.id, MA.semestre, MA.association, APR.role FROM MembreAsso MA LEFT JOIN APourRole APR On MA.id=APR.membreasso WHERE MA.personne=\''.$this->login.'\' ORDER BY cast(substring(MA.semestre,2,3) as integer) DESC, substring(MA.semestre,1,1) ;';
        
        $query=new DbQuery($db,$sql);
        $query->SendQuery();
        $this->asso=array();
        
        //construction d'un tableau de 3 dimensions
        //1e dimension : le semestre
        //2e dimension : l'asso
        //3e dimension : les d�tails
        /* |-[A10]
        *  |    |- [Festupic]
        *  |    |   |-0
        *  |    |        |-[id]-> 1
        *  |    |        |-[role]-> Pr�sident
        *  |    |   |-1
        *  |    |        |-[id]-> 5
        *  |    |        |-[role]-> Responsable pizzas
        *  |    |- [PMDE]
        *  |    |   |-0
        *  |    |        |-[id]-> 3
        *  |    |        |-[role]-> Responsable file d'attente
        *  |-[P12]
         * |    |-[Larsen]
         * |    |   |-0
         * |    |       |-[id]-> 15
         * |    |       |-[role]-> Joueur officiel de guimbarde
        */
        while($result=$query->GetResult()){
            if(isset($this->asso[$result['semestre']][$result['association']]))
                $index=count($this->asso[$result['semestre']][$result['association']]);
            else
                $index=0;
            $this->asso[$result['semestre']][$result['association']][$index]['id']=$result['id'];
            $this->asso[$result['semestre']][$result['association']][$index]['role']=$result['role'];     
        }
                  
    }
    
    public function FillCotisArray(DbConnection $db){
        //rempli le tableau $cotis
         
        $sql = 'SELECT annee FROM cotisation WHERE personne=\''.$this->login.'\';';
        
        $query= new DbQuery($db,$sql); //Cr�ation d'un objet Query gr�ce � la requete SQL et la BDD pass�e en param�tre
        $query->SendQuery();//envoi de la requ�te
        
        $this->cotis=array();
        $i=0;
        while($result=$query->GetResult()){
            $this->cotis[$i]=$result['annee'];
            $i++;
        }
        
    }
    public function FillRapportsArray(DbConnection $db){
        //rempli le tableau $rapports
        $sql = "SELECT rapport.association as association, titre, dateedition,url FROM rapport, membreasso Join rediger on membreasso.id = rediger.redacteur where rapport.id =rediger.rapport and personne ='".$this->login."' group by rapport.association, rapport.titre, rapport.dateedition, rapport.url order by dateedition DESC;";
        $query=new DbQuery($db, $sql);
        $query->SendQuery();
        $this->rapports=array();
        while($result=$query->GetResult()){
            $i=count($this->rapports);
            $this->rapports[$i]['association']=$result['association'];
            $this->rapports[$i]['titre']=$result['titre'];
            $this->rapports[$i]['dateedition']=$result['dateedition'];
            $this->rapports[$i]['url']=$result['url'];
        }
    }
    public function IsMemberOf($asso, DbConnection $db, $date=0){
        //cherche si la personne est membre d'une asso � un date donn�e (time() si non renseign�)
        $sem=GetSemester($date);
        $asso=addslashes($asso);//�chape les caract�res sp�ciaux (ex d'utilit� : Volley'UTC)
        $sql='SELECT id FROM membreasso WHERE association=\''.$asso.'\' AND personne=\''.$this->login.'\' AND semestre=\''.$sem.'\'AND valide=1;';
        $query=new DbQuery($db, $sql);
        $query->SendQuery();
        if($result=$query->GetResult())
            return $result['id'];
        return false;
    }
    
    public function InscrireAsso(DbConnection $db, Association $asso){
        //inscrit la personne � l'associatipon $asso
        
        $sql='INSERT INTO membreasso(semestre,personne, association, valide) VALUES (\''.GetSemester().'\',\''.$this->login.'\', \''.$asso->GetNom().'\', 0);';
        echo $sql;
        $query=new DbQuery($db, $sql);
        $result=$query->SendQuery();
        
        if($result)
            return true;
        else
            return false;
    }

    static public function newPersonne(DbConnection $db,$nom,$prenom,$pwd,$dob,$adresse=NULL,$photo=NULL){
    //fonction static qui ajoute une nouvelle entr�e � la table personne    
        $nom=ucwords(strtolower($nom));
        $prenom=ucwords(strtolower($prenom));
        $sql;
        if(!is_null($photo)){
            $sql='INSERT INTO Personne(nom, prenom, adresse, pwd, photo, datenaissance) VALUES (\''.$nom.'\',\''.$prenom.'\',\''.$adresse.'\',\''.md5($pwd).'\',\''.$photo.'\',\''.$dob.'\');'; 
        }else{
            $sql='INSERT INTO Personne(nom, prenom, adresse, pwd, datenaissance) VALUES (\''.$nom.'\',\''.$prenom.'\',\''.$adresse.'\',\''.md5($pwd).'\',\''.$dob.'\');';
        }
        $query=new DbQuery($db, $sql);
        return $query->SendQuery();
        
    }
    
    //-------------Accesseurs
    public function IsConnected(){
    //v�rifie que la personne est connect�e    
        return $this->connected;
    }
    
    public function IsCotisant(DbConnection $db){
        date_default_timezone_set('Europe/Berlin');
        $annee=intval(date('Y'));
        
        $sql='SELECT validee FROM cotisation c WHERE c.annee='.$annee.' AND c.personne=\''.$this->login.'\';';
        $query = new DbQuery($db,$sql);
        $query->SendQuery();
        $result=$query->GetResult();
        if($result['validee']==1)
        {
            return true;
            
            }
        else
        {
            return false;
            
            }
        
    }
    public function IsWaiting(DbConnection $db){
        date_default_timezone_set('Europe/Berlin');
        $annee=intval(date('Y'));
        
        $sql='SELECT count(*) as nombre FROM cotisation c WHERE c.annee='.$annee.' AND c.personne=\''.$this->login.'\' AND c.validee=0;';
        $query = new DbQuery($db,$sql);
        $query->SendQuery();
        $result=$query->GetResult();
        if($result['nombre']==1)
        {
            return true;
            
            }
        else
        {
            return false;
            
            }
        
    }
	
	public function IsBureau(DbConnection $db,$asso){
	
		$roles=$this->GetRole($db,$asso);
		$i;
		for($i=0;$i<count($roles);$i++){
			if($roles[$i]=='Président'||$roles[$i]=='Trésorier'||$roles[$i]=='Secrétaire')
				return true;
		}
		return false;
	}
    public function GetInfo(DbConnection $db){
        //Retourne un tableau cl�/valeur avec les infos de la personne
        $this->FillAssoArray($db);
        $this->FillCotisArray($db);
        $this->FillFromLogin($db);
        $this->FillRapportsArray($db);
        $result=array();
        $result['login']=$this->login;
        $result['nom']=$this->nom;
        $result['prenom']=$this->prenom;
        $result['adresse']=$this->adresse;
        $result['mail']=$this->mail;
        $result['datenaissance']=$this->dateNaissance;
        $result['asso']=  $this->asso;
        $result['cotis']=  $this->cotis;
        $result['rapports']=$this->rapports;
        
        return $result;
        
    }
    public function GetLogin(){
        return $this->login;
    }
    
    public function GetAsso(DbConnection $db){
        $this->FillAssoArray($db);
        return $this->asso;
    }
    public function GetNomComplet(){
        return $this->prenom.' '.$this->nom;
    }
    
    public function GetMail(){
        return $this->mail;
    }
    
    public function GetDdn(){
        return $this->dateNaissance;
    }
    public  function GetRapports(DbConnection $db){
        $this->fillRapportsArray($db);
        return $this->FillRapportsArray($db);
    }
    
    public function GetRole(DbConnection $db, $asso)
    {
        $sql="SELECT role FROM apourrole AP, membreasso MA WHERE MA.id=AP.membreasso AND MA.personne='".$this->GetLogin()."' AND MA.association='".$asso."';";
		$res = array();
        $i=0;
        $query=new DbQuery($db, $sql);
        $result=$query->SendQuery();
        if($result){
            while($result=$query->GetResult()){
                $res[$i]=$result['role'];
                $i++;
            }
            return $res;
        }
        else
            if ($this->IsMemberOf($asso, $db))
                return "membre";
            else
                return "rien";
    }
    
            
    
}
?>
